Digital VLSI Design Lecture 4 Logic Synthesis Part 2
课程主页:
http://www.eng.biu.ac.il/temanad/digital-vlsi-design/
课程视频:
https://www.youtube.com/watch?reload=9&v=RbZ3BXbd6_k&list=PLZU5hLL_713x0_AV_rVbay0pWmED7992G
https://www.bilibili.com/video/BV1EA411n7VQ?from=search&seid=14545899898143497364
这次回顾第四讲,这一讲继续介绍了逻辑综合。
布尔最小化
细化与绑定
- 在逻辑综合的下一步骤中,工具:
- 将RTL编译为布尔数据结构(细化)
- 将非开关量模块绑定到叶子单元(绑定)
- 优化布尔逻辑(最小化)
- 最终的设计被映射到通用的、与技术无关的逻辑门
- 这是综合的核心,自八十年代以来一直是计算机科学中一个非常核心的研究课题
细化例子
两级逻辑
- 在细化过程中,定义主要输入和输出(端口),并推导时序元素(触发器,锁存器)
- 这导致一组组合逻辑云:
- 输入端口和寄存器输出为逻辑的输入
- 输出端口和寄存器输入是逻辑的输出
- 输出可描述为输入的开关的函数
- 布尔最小化的目的是减少输出函数中的因子数
- 许多不同的数据结构用于表示布尔函数:
- 真值表、立方体、BDD、方程等
- 大部分研究都是在SOP或POS表示法上发展起来的,这两者通常称为“二级逻辑”
二级逻辑最小化
- 卡诺图,但是难以自动化(NP-complete)
- Quine-McCluskey方法,易于在软件中实现,但是计算复杂度太高
Espresso启发式最小化
ESPRESSO(F){
do {
reduce(F);
expand(F);
irredundant(F);
}while (fewer terms in F);
verify(F);
}
- 从SOP开始
- Expand
- 使每个立方体尽可能大而不覆盖OFF集中的一个点。
- 增加因子数量(更糟糕的解决方案)。
- Irredundant
- 扔掉多余的立方体。
- 删除被较大立方体覆盖的小立方体。
- Reduce
- 覆盖中的立方体大小减少了 。
- 一般而言,新覆盖与最初的覆盖不同
- expand和irredundant的步骤可能会找到一种覆盖ON集合中的点的新方法。
- 希望新的覆盖会更小一些。
- Expand
Espresso例子
多级逻辑最小化
- 两级逻辑最小化已经得到广泛的研究,并由此产生了许多著名的方法。
- 然而,通常使用许多层次的逻辑是更好和/或更实用。
- 因此,提出了一个全新的优化方案,即多级逻辑最小化。
- 在本课程中,我们将不讨论多级最小化问题,但是,您应该知道逻辑最小化通常输出多级,而不是两级。
例子:
BDD
- BDD是表示给定函数真值表的DAG。
- 函数的香农展开将函数与其辅因子相关联:
- 给定一个布尔函数:$f\left(x_{1}, x_{2}, \ldots, x_{i}, \ldots, x_{n}\right)$
- 正辅因子:$f_{i}^{1}=f\left(x_{1}, x_{2}, \ldots, 1, \ldots, x_{n}\right)$
- 负辅助因子:$f_{i}^{0}=f\left(x_{1}, x_{2}, \ldots, 0, \ldots, x_{n}\right)$
- 香农展开定理指出
- $f=x_{i}^{\prime}f_{i}^{0}+x_{i} f_{i}^{1}$
- $f=\left(x_{i}+f_{i}^{0}\right)\left(x_{i}^{\prime}+f_{i}^{1}\right)$
这导致BDD的形成:
BDD的一些优点:
- 检查tautology是微不足道的
- tautology是指BDD为常数1
- 取反
- 给定函数$f$的BDD,可以通过交换终止节点获得$f’$的BDD。
- 等价性检查。
- 如果函数$f$和$g$的BDD(在相同的变量顺序下)相同,则这两个函数是等价的。
- 检查tautology是微不足道的
- 要点:
- 如果变量被扩展的顺序被改变,BDD的大小会发生很大变化。
- BDD中的节点数可以是变量数的指数
ROBDD
BDD会变得很大。
- 所以,让我们看看我们是否可以提供一个化简的表达。
化简规则1:合并等价叶子节点
化简规则2:合并同构节点
化简规则2:消除冗余测试
约束定义
在细化之后,设计被加载到综合工具中,并存储在数据结构中。
分级端口(输入/输出)和寄存器可以按名称访问。
set in_ports [get_ports IN*] set regs [get_cells -hier *_reg]
此时,我们可以以SDC格式加载设计约束,我们将在第5节课中学习
read sdc -verbose sdc/constraints.sdc
例如,要创建时钟并定义目标频率:
create_clock -period $PERIOD -name $CLK_NAME [get_ports $CLK_PORT]
仔细检查工具是否接受所有约束!
技术映射
- 技术映射是从技术库中选择门实现电路的逻辑合成阶段。
- 为什么要做技术映射?
- 直接实现可能不太好。
- 例如,$F= abcdef$作为$6$输入与门,会造成较长的延迟。
- 库的门是预先设计的,通常在面积、延迟、功率等方面进行优化。
- 可以应用最小代价树覆盖算法来解决这个问题。
技术映射算法
- 使用递归树覆盖算法,我们可以很容易地并且几乎是最佳地将逻辑网络映射到技术库。
- 这个过程包括三个步骤:
- 将网表和技术库映射到简单门
- 用NAND2和NOT门描述网表
- 用NAND2和NOT门的描述SC库,并将成本与每个门相关联
- 将输入网表树形化
- 树覆盖只能用于树
- 将扇出$>2$的地方划分树
- 最小成本树匹配
- 对于树中的每个节点,递归地在该节点上找到最小成本目标模式。
- 将网表和技术库映射到简单门
- 让我们简单地介绍一下这些步骤
1.简单门映射
将De Morgan定律应用到布尔函数中,使其成为NAND2和NOT门的集合。
以多级逻辑最小化为例:
然后,给定一组具有成本度量(面积/延迟/功率)的门(标准单元库):
- 我们需要用相同的NAND2/NOT集合来定义门:
2.树形化
- 要应用树覆盖算法,我们必须在树上工作!
- 任何给定的逻辑网络都是树形的吗?
- 不!
- 我们必须在扇出$>2$的任意节点划分树
3.最小树覆盖
现在,我们可以应用递归算法来达到最小覆盖:
从图的输出开始。
对于每个节点,找到所有匹配的目标模式。
节点$i$使用门$g$的代价为:
其中$k_i$是$g$门的输入:
为简化起见,我们将重新绘制图表并显示一个示例:
- 每个NOT只是一个空圆:
- 每个NAND只是一个完整的圆:
- 每一个输入只是一个方框:
完整例子:
综合Verilog
我们可能忽略的部分
既然我们已经看到了综合是如何工作的,让我们重温一下我们可能跳过或只是简单地提到过的一些事情…
以一个简单的$4\to 2$编码器为例:
- 取独热码向量,输出$1$的位置。
- 一种可能性是用嵌套的if else块来描述这个逻辑:
- 这个结果称为“优先逻辑”
- 即,有些比特优先于其他比特。
最好使用case构造:
所有情形并行匹配
更好的是,综合可以优化常数和其他布尔等式:
在前面的示例中,如果编码错误(即不是独热码),我们将在逻辑模拟中传播$x$。
但是如果我们保证输入是一个独热码呢?
然后我们可以用不同的方式编写代码:
事实上,我们已经实现了“优先级译码器”。
运算符的几点内容
- 逻辑运算符映射到基本逻辑门
- 算术运算符映射到加法器、减法器
- 关系运算符生成比较器
- 固定数量的移位只是电线连接
- 不涉及逻辑
- 可变的移位量$\to$移位器
- 条件表达式生成逻辑或MUX
数据路径综合
复杂运算符(加法器、乘法器等)以特殊方式实现:
预先写好的说明可在Synopsys DesignWare或Cadence ChipWare IP库中找到。
时钟门控
- 如你所知,由于时钟是不断摆动的,它是一个主要的能力消耗者。
- 因此,为了节省电力,我们将尽量关闭不使用的闸门的时钟。
- 块级(Global)时钟门控
- 如果某些工作模式不使用整个模块/组件,则应在RTL中定义时钟门。
- 寄存器级(Local)时钟门控配置寄存器。
- 但是,即使在寄存器级别,如果触发器不改变其输出,由于时钟振荡,内部电源仍然耗散。
- 这在启用的信号采样中非常常见,因此,综合工具可以自动检测和门控。
局部时钟门控:3种方法
- 逻辑综合器发现并实现局部门控机会
- RTL代码显式指定时钟门控
- RTL中显式实例化的时钟门控单元
全局时钟门控:2种方法
- RTL代码显式指定时钟门控
- RTL中显式实例化的时钟门控单元
时钟门控——毛刺问题
解决方案:无毛刺时钟门
通过在正相期间锁存enable信号,我们可以消除毛刺:
合并时钟enable门
- 具有共同的enable时钟门可以合并
- 更低的时钟树功率,更少的门
- 可能影响enable信号定时和倾斜
数据门控
- 虽然时钟门控是被很好的理解和自动化的,但是由于没有使用的数据信号的振荡,也会发生一些问题。
- 这些情况应得到识别,数据应该门控。
设计与验证-HDL Linting
- HDL Linting工具可快速轻松检查可能出现的编码不一致:
- 仿真问题
- 综合问题
- 模拟综合不匹配
- 时钟门控
- 锁存推断
- 时钟域交叉问题
- 无意义的赋值/隐式位宽问题
- 不用于检查语法正确性
- 或者,一些综合工具会给你基本的lint警告
- 对于仿真综合不匹配错误
时钟优化
我们可以优化时间吗
- 综合器对逻辑运用许多“转换”以改进开销函数:
- 调整单元格大小
- 缓冲区或克隆以减少关键网络上的负载
- 分解大单元
- 交换pin或等效网之间的交换连接
- 前移关键信号
- 填充早期路径
- 区域恢复
- 简单示例:
- 双反相器移除变换:
调整大小、克隆和缓冲
调整逻辑门的大小以更好地驱动负载:
或复制(复制门)以分散负载:
或只是缓冲扇出网:
重新设计扇入/扇出树
重新设计树的扇入
重新设计树的扇出
分解和交换
考虑将复杂的门分解为不太复杂的门:
互换交流pin:
- 对到达时间和延误进行简单的排序可以帮助
再定时
假定网络如下:
如何满足10ns时钟周期?
顺序元素和组合逻辑的重新排序